Contents

import pandas as pd
import geopandas as gpd
import plotly.graph_objects as go
gemeenten_shapefile = 'gadm41_NLD_1.shp'
gdf = gpd.read_file(gemeenten_shapefile)
gdf = gdf[~gdf['NAME_1'].isin(['Zeeuwse meren', 'IJsselmeer'])]
gdf.loc[gdf['NAME_1'] == 'Fryslân', 'NAME_1'] = 'Friesland'
gdf.loc[gdf['NAME_1'] == 'NA', 'NAME_1'] = 'Zuid-Holland'

dataset = pd.read_csv('hoogst_behaald_onderwijsniveau.csv', sep=';', encoding='utf-8')

dataset.columns = [col.strip('\"') for col in dataset.columns]

merged = gdf.merge(dataset, how='left', left_on='NAME_1', right_on="Regio's")

counties_geojson = merged.__geo_interface__

fig = go.Figure()

fig.add_trace(go.Choroplethmapbox(
    geojson=counties_geojson,
    locations=merged.index,
    z=merged['Laag onderwijsniveau (%)'],
    colorscale='blues',
    zmin=merged['Laag onderwijsniveau (%)'].min(),
    zmax=merged['Laag onderwijsniveau (%)'].max(),
    marker_opacity=0.5,
    marker_line_width=1.5,
    hovertemplate='<b>%{properties.NAME_1}</b><br>' +
                  'Laag onderwijsniveau: %{z:.2f} % <extra></extra>',
    visible=True,
    name='Laag onderwijsniveau (%)'
))

fig.add_trace(go.Choroplethmapbox(
    geojson=counties_geojson,
    locations=merged.index,
    z=merged['Middelbaar onderwijsniveau (%)'],
    colorscale='blues',
    zmin=merged['Middelbaar onderwijsniveau (%)'].min(),
    zmax=merged['Middelbaar onderwijsniveau (%)'].max(),
    marker_opacity=0.5,
    marker_line_width=1.5,
    hovertemplate='<b>%{properties.NAME_1}</b><br>' +
                  'Middelbaar onderwijsniveau: %{z:.2f} % <extra></extra>',
    visible=False,
    name='Middelbaar onderwijsniveau (%)'
))

fig.add_trace(go.Choroplethmapbox(
    geojson=counties_geojson,
    locations=merged.index,
    z=merged['Hoog onderwijsniveau (%)'],
    colorscale='blues',
    zmin=merged['Hoog onderwijsniveau (%)'].min(),
    zmax=merged['Hoog onderwijsniveau (%)'].max(),
    marker_opacity=0.5,
    marker_line_width=1.5,
    hovertemplate='<b>%{properties.NAME_1}</b><br>' +
                  'Hoog onderwijsniveau: %{z:.2f} % <extra></extra>',
    visible=False,
    name='Hoog onderwijsniveau (%)'
))

fig.update_layout(
    mapbox_style="carto-positron",
    mapbox_zoom=6,
    mapbox_center={"lat": 52.1326, "lon": 5.2913},
    margin={"r": 150, "t": 100, "l": 100, "b": 150},
    title='Onderwijsniveaus in Nederlandse provincies',
    coloraxis_colorbar=dict(
        title='Onderwijsniveau (%)',
        ticksuffix=' %',
    ),
    width=750,
    height=800
)

steps = []
for i, level in enumerate(['Laag onderwijsniveau (%)', 'Middelbaar onderwijsniveau (%)', 'Hoog onderwijsniveau (%)']):
    step = dict(
        method="update",
        args=[{"visible": [False] * len(fig.data)},
              {"title": f"{level} in Nederlandse provincies"}],
        label=level
    )
    step["args"][0]["visible"][i] = True
    steps.append(step)

sliders = [dict(
    active=0,
    currentvalue={"prefix": "Onderwijsniveau: "},
    pad={"t": 50},
    steps=steps
)]

fig.update_layout(sliders=sliders)

fig.show()